perm filename MIXDD[MIX,SYS] blob sn#020813 filedate 1972-02-29 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00006 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	 ROUTINES TO DISPLAY MIX STATUS ON DATA DISK DISPLAYS
 00003 00003	 GET SYMBOLIC NEXT INSTRUCTION  
 00008 00004	 NOW WRITE ALL INFO TO THE DATA DISK BUFFER 
 00013 00005	 TABLES USED BY DDUPD 
 00015 00006	 ROUTINE TO REFRESH WHOLE SCREEN 
 00016 ENDMK
⊗;
COMMENT ⊗ ROUTINES TO DISPLAY MIX STATUS ON DATA DISK DISPLAYS

	For each screen entry, there is a shadow entry kept of the
contents of the screen.  When DDUPD is called, only those things which
have changed are rewritten.  
⊗
BEGIN DDDPY
	T←←	0
	A←←	1
	B←←	2
	C←←	3
	D←←	4
	E←←	5
	F←←	6
	NEWMSK←←  16


↑DDUPD:			;UPDATE DD DISPLAY
	MOVEM	16,SVREG+16	;SAVE REGISTERS
	MOVEI	16,SVREG
	BLT	16,SVREG+15

COMMENT ⊗ GET SYMBOLIC NEXT INSTRUCTION  ⊗


	MOVEI	T,1		;INITIALIZE  
	MOVEM	T,NXINS		;  AREA FOR SYMBOLIC NEXT INSTRUCTION
	MOVE	A,[XWD NXINS,NXINS+1]
	BLT	A,NXINS+11
	MOVE	T,[POINT 7,NXINS]

;	DO THE LABEL

	HRRZ	10,SVREG+16	;GET PC
	SUBI	10,MC0000	;MAKE THAT RELATIVE
	PUSHJ	P,SYMGET	;GET LABEL FOR INSTR
	JUMPE	3,NXS1		;NO SYMBOL
	SKIPN	3(3)		;SEE IF VALUE OF SYMBOL IS 0
	JRST	NXS1		;DO LIKE RAID, DON'T PRINT IT
	CAIG	4,77		;DON'T PUT OUT AN OFFSET OF GREATER THAN 77
	JRST	.+3
	MOVE	4,10		;PUT VALUE OF LOC IN REG 4
	JRST	NXS1		;PUT THAT VALUE IS DISPLAY
	PUSHJ	P,SYMOUT	;PUT SYMBOL IN BUFFER
	JUMPE	4,NXS2		;NO OFFSET
	MOVEI	A,"+"
	IDPB	A,T		;DEPOSIT A +
NXS1:	PUSHJ	P,NUMOUT
NXS2:	MOVEI	A," "
	IDPB	A,T		;DEPOSIT 2 BLANKS
	IDPB	A,T

;	DO THE OP CODE

	MOVE	7,10		;GET REL LOC OF INSTR
	PUSHJ	P,DECIDF	;DECIDE ABOUT F FIELD
	MOVE	B,@STROP(10)	;GET OP CODE MNEMONIC
	MOVEM	B,MNEM#
	MOVE	B,[POINT 7,MNEM]
	ILDB	A,B
	JUMPE	A,NXS3		;COPY UNTIL 0
	IDPB	A,T
	JRST	.-3
NXS3:	MOVEI	A," "		;NOW 2 MORE BLANKS
	IDPB	A,T
	IDPB	A,T

;	DO THE ADDRESS PART

	HLRZ	10,MC0000(7)	;PICK UP ADDR OF INSTR
	SKIPL	MC0000(7)	;IS IT NEGATIVE
	JRST	NXS5		;NO
	ANDI	10,7777
	TLO	10,400000	;TURN ON SIGN BIT
	PUSHJ	P,GETNSM	;LOOK UP IN SYMTAB
	JUMPN	4,NXS4		;EXACT MATCH
	MOVEI	A,"-"		;WE'LL NEED THIS IN ANY OTHER CASE
	IDPB	A,T
	JUMPN	3,NXS4		;THERE WAS A ABS VAL MATCH
	HRRZ	4,10		;PUT ABS VAL IN OFFSET SLOT
	JRST	NXS6		;GO DO IT
NXS4:	PUSHJ	P,SYMOUT	;PUT OUT SYMBOLIC
	JRST	NXS7
NXS5:	PUSHJ	P,SYMGET	;LOOK UP SYMBOL AND OFFSET
	JUMPE	3,NXS6		;NO SYMBOL
	SKIPN	3(3)		;SEE IF VALUE OF SYMBOL IS 0
	JRST	NXS6		;DO LIKE RAID, DON'T PRINT IT
	CAIG	4,77		;DON'T PUT OUT AN OFFSET OF GREATER THAN 77
	JRST	.+3
	MOVE	4,10		;PUT VALUE OF LOC IN REG 4
	JRST	NXS6		;PUT THAT VALUE IS DISPLAY
	PUSHJ	P,SYMOUT	;WRITE SYMBOL
	JUMPE	4,NXS7		;NO OFFSET
	MOVEI	A,"+"
	IDPB	A,T		;PUT OUT A +
NXS6:	PUSHJ	P,NUMOUT	;PUT OUT OFFSET

;	DO INDEX FIELD

NXS7:	LDB	4,[POINT 6,MC0000(7),23]	;PICK UP INDEX
	JUMPE	4,NXS8		;NO INDEX
	MOVEI	A,","
	IDPB	A,T		;PUT OUT A ,
	PUSHJ	P,NUMOUT	;PUT OUT INDEX VALUE

;	DO F FIELD IF NOT THE DEFAULT FOR THE OP CODE

NXS8:	JUMPN	6,UPD1		;GO UPDATE
	MOVEI	A,"("
	IDPB	A,T
	LDB	4,[POINT 6,MC0000(7),29]	;GET FIELD SPEC
	PUSHJ	P,NUMOUT	;WRITE IT OUT
	MOVEI	A,")"
	IDPB	A,T
	JRST	UPD1		;NOW GO WRITE SCREEN

COMMENT ⊗ WRITE OUT THE LABEL WHICH IS A SIXBIT STRING OF UP TO 12 CHARACTERS
	IN LOCATIONS 1(3)-2(3).  DEPOSIT ASCII CHARACTERS BY POINTER T
	⊗
SYMOUT:	MOVE	A,1(3)		;GET FIRST 6 CHARS
	MOVEM	A,SYMB
	MOVE	A,2(3)
	MOVEM	A,SYMB+1
	MOVE	B,[POINT 6,SYMB]
	ILDB	A,B		;GET A CHAR
	JUMPE	A,.+4		;QUIT AT 0
	ADDI	A,40		;CONVERT TO ASCII
	IDPB	A,T		;STORE IN OUTPUT BUFFER
	JRST	.-4
	POPJ	P,
SYMB:	BLOCK	2
	0

COMMENT ⊗ WRITE OUT THE NUMBER IN REG 4 IN DECIMAL ⊗

NUMOUT:	IDIVI	4,=10		;DIVIDE BY TEN
	HRLM	5,(P)		;SAVE ON STACK
	SKIPE	4		;IS THAT ALL
	PUSHJ	P,NUMOUT	;NO
	HLRZ	4,(P)		;GET DIGIT OFF STACK
	ADDI	4,60		;CONVERT TO ASCII
	IDPB	4,T		;STORE IT
	POPJ	P,		;NEXT DIGIT OR RETURN

COMMENT ⊗ NOW WRITE ALL INFO TO THE DATA DISK BUFFER ⊗

UPD1:	MOVNI	A,NDPY		;GET # OF ENTRIES
	SKIPA	NEWMSK,[0]	;ZERO OUT MASK FOR CHANGED ENTRIES
LKDPY:	LSH	NEWMSK,1	;GET PLACE FOR BIT FOR NEXT ENTRY
	MOVE	B,SIZE+NDPY(A)	;GET (SIZE OF ENTRY)-1
	HLRZ	C,LOC+NDPY(A)	;GET LOC OF NEW ENTRY
	HRRZ	D,LOC+NDPY(A)	;GET LOC OF SHADOW ENTRY
	HRLI	C,B
	HRLI	D,B

;	Now compare entry with shadow entry

CMPR:	MOVE	T,@C		;PICK UP WORD OF NEW
	CAME	T,@D		;COMPARE TO SHADOW
	JRST	NEW1		;NOT THE SAME
	SOJGE	B,CMPR		;LOOK AT NEXT WORD
	AOJLE	A,LKDPY		;NO CHANGE IN ENTRY, LOOK AT NEXT ENTRY
	JRST	WRIT1		;THAT'S ALL, GO WRITE EVEN LINES
NEW1:	IORI	NEWMSK,1	;TURN ON BIT IN MASK
	AOJLE	A,LKDPY		;LOOK AT NEXT ENTRY

;	At this point, NEWMSK has a bit on for each entry that has changed
;	from what it is on the screen.  Write even lines of these entries


WRIT1:
	JUMPE	NEWMSK,WRIT4	;QUIT IT THERE'S NOTHING TO DO
	MOVEM	NEWMSK,MSKSAV#	;SAVE MASK
	MOVEI	A,NDPY		;GET # OF ENTRIES
	MOVEI	E,DDBUF+1	;POINT TO DD BUFFER
	SKIPA
WRIT1A:	LSH	NEWMSK,-1	;GET BIT FOR NEXT ENTRY
	JUMPE	NEWMSK,WRIT2	;QUIT IF NO MORE HAVE CHANGED
	TRNN	NEWMSK,1	;IS BIT ON FOR THIS ENTRY?
	SOJA	A,WRIT1A	;NO
	MOVE	T,DDCODE(A)	;GET DD INSTR
	MOVEM	T,(E)		;STORE IN BUFFER
	MOVEI	B,1(E)		;GET LOC OF AVAIL BUFFER
	MOVE	C,B		;SAVE LOC
	HLL	B,LOC(A)	;GET LOC OF NEW ENTRY
	ADD	C,SIZE(A)	;POINT TO LAST LOC OF BLT
	BLT	B,(C)		;MOVE NEW ENTRY TO BUFFER
	ADD	E,SIZE(A)
	MOVE	T,CRLF		;TACK CR-LF ON END OF ENTRY
	MOVEM	T,2(E)
	ADDI	E,3		;MOVE E PAST NEW CODE
	SOJGE	A,WRIT1A	;NOW DO NEXT ENTRY

;	Now write odd lines and move entries to shadows

WRIT2:
	MOVE	NEWMSK,MSKSAV	;GET MASK
	MOVEI	A,NDPY		;GET # OF ENTRIES
	SKIPA
WRIT2A:	LSH	NEWMSK,-1	;GET BIT FOR NEXT ENTRY
	JUMPE	NEWMSK,WRIT3	;QUIT IF NO MORE HAVE CHANGED
 	TRNN	NEWMSK,1	;IS BIT ON FOR THIS ENTRY?
	SOJA	A,WRIT2A	;NO
	MOVE	T,DDCODE(A)	;GET DD INSTR
	IORI	T,10000		;SPECIFY ODD LINE
	MOVEM	T,(E)		;STORE IN BUFFER
	MOVEI	B,1(E)		;GET LOC OF AVAIL BUFFER
	MOVE	C,B		;SAVE LOC
	HLL	B,LOC(A)	;GET LOC OF NEW ENTRY
	ADD	C,SIZE(A)	;POINT TO LAST LOC OF BLT
	BLT	B,(C)		;MOVE NEW ENTRY TO BUFFER
	ADD	E,SIZE(A)
	MOVE	T,CRLF		;TACK CR-LF ON END OF ENTRY
	MOVEM	T,2(E)
	ADDI	E,3		;MOVE E PAST NEW CODE
	MOVE	B,LOC(A)	;NOW MOVE TO SHADOW
	MOVEI	C,(B)
	ADD	C,SIZE(A)
	BLT	B,(C)
	SOJGE	A,WRIT2A	;NOW DO NEXT ENTRY

;	We are now ready to write the buffer

WRIT3:
	SETZM	T,(E)		;PUT A 0 AT THE END OF THE BUFFER
	SUBI	E,DDBUF-1	;CALCULATE SIZE OF BUFFER
	MOVEM	E,DDOPG+1
	UPGIOT	1,DDOPG		;WRITE SCREEN

;	The display is updated, restore registers and return

WRIT4:	MOVSI	16,SVREG
	BLT	16,16
	POPJ	P,

SVREG:	BLOCK	17		;REGISTERS SAVED HERE
DDOPG:	DDBUF
	0
CRLF:	ASCID	/
/

COMMENT ⊗ TABLES USED BY DDUPD ⊗
DD1(4)
	ASCID	/NEXT INS: /		;BUFFER FOR SYMBOLIC NEXT INSTRUCTION
NXINS:	BLOCK	12
DD2(4)

NDPY←←21-1

SIZE:		;CONTAINS (SIZE OF ENTRY)-1

	FOR @& A←NDPY+1,1,-1
{DDSZ&A -1
}

MAXBUF←←0	;COUNTER TO DETERMINE BUFFER SIZE NEEDED
MAXSHA←←0	;POINTER INTO SHADOW TABLE

LOC:		;CONTAINS XWD <LOC OF ENTRY>,<LOC OF SHADOW>

	FOR @& A←NDPY+1,1,-1

{	XWD	DDLB&A,SHADOW+MAXSHA
MAXSHA←←MAXSHA+DDSZ&A
MAXBUF←←MAXBUF+DDSZ&A+2
}

A←←344

DDCODE:		;CONTAINS DATA DISK INSTRUCTION FOR ENTRY

	REPEAT NDPY+1, {BYTE (8) 2,A⊗-4,A∧17 (3) 3,4,5,4
		A←←A-14}

SHADOW:	BLOCK	MAXSHA+1
DDBUF:	BYTE	(8) 46,2,2 (3) 1,3,3,4
	BLOCK	2*MAXBUF+2

COMMENT ⊗ ROUTINE TO REFRESH WHOLE SCREEN ⊗

↑REWRIT:	;REWRITE WHOLE SCREEN
	MOVEM	0,SVREG		;SAVE REGISTER 0
	SETZM	SHADOW		;ZERO OUT SHADOW REGISTERS
	MOVE	0,[XWD SHADOW,SHADOW+1]
	BLT	0,SHADOW+MAXSHA
	MOVE	0,SVREG
	JRST	DDUPD		;UPDATE SCREEN

BEND DDDPY